import axios from 'axios'
import { message } from 'ant-design-vue'
import 'ant-design-vue/es/message/style/css' // vite只能用 ant-design-vue/es 而非 ant-design-vue/lib
import { useAuthStore } from '@/store/auth'

// 给axios设置一些默认行为
switch (process.env.NODE_ENV) {
  case 'production':
    axios.defaults.baseURL = 'http://124.222.65.95:18581'
    break
  case 'development':
    axios.defaults.baseURL = '/jeecg-boot'
    break
}

const axiosInstance = axios.create()
// 设置超时时间
axiosInstance.defaults.timeout = 5000
// 设置跨域是否需要携带凭证
axiosInstance.defaults.withCredentials = false
// 设置判断是否响应成功的校验,3开头的代码一般都不在接口里面返回，一般都是资源类数据会返回
axiosInstance.defaults.validateStatus = (status) => {
  return /^2|3\d{2}$/.test(status.toString())
}
// 设置post请求头
// axiosInstance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

// 设置请求拦截器，
axiosInstance.interceptors.request.use(
  (config) => {
    // 进行token校验（JWT）：接收服务器返回的token，存储到本地，每次发送请求，都需要带上token
    // token && (config.headers.Authorization = token)
    // config需要返回
    const store = useAuthStore()
    const token = store.token

    token && (config.headers['X-Access-Token'] = token)

    return config
  },
  async (error) => {
    // 请求错误的操作，返回报错信息
    return await Promise.reject(error)
  }
)

// 设置响应拦截器
/**
 * response 包含内容：
 * response: {
 *  data: 响应主体内容，一般都是后端返回的数据
 *  status： 服务器相应的状态码
 *  statusText: 响应状态码的描述，
 *  headers：服务器响应头
 *  config: 之前发送请求是发送给服务器的配置对象
 *  request: 原生的ajax对象
 * }
 *
 */
axiosInstance.interceptors.response.use(
  (response) => {
    if (response.data?.data?.token) {
      localStorage.setItem('token', response.data.data.token)
    }
    // console.log(response.data.code)
    const type = response.data.code === 200 ? 'success' : 'error'
    response.data.code &&
      message[type]({
        content: response?.data?.message
      })
    return response.data
  },
  async (error) => {
    const { response } = error
    // console.log(response)

    // 如果返回了response，证明服务器返回了结果，可以通过返回的状态码判断
    if (response) {
      switch (response.status) {
        // 当前请求用户需要验证，一般为需要验证用户(未登录)
        case 401:
          break
        // 服务器接收到请求，但拒绝处理，一般为登录状态过期（token失效）
        case 403:
          localStorage.removeItem('token')
          break
        // 找不到资源，
        case 404:
          break
        case 500: // token失效
          if (response.data.status === 500) {
            alert(response.data.message)
          }
      }
    } else {
      // 说明服务器连结果都没有返回，可能的原因有两种：
      /**
       * 1. 服务器崩掉了
       * 2. 前端客户端断网状态
       */
      if (!window.navigator.onLine) {
        // 判断为断网，可以跳转到断网页面

      } else {
        return await Promise.reject(error)
      }
    }
  }
)

export default axiosInstance
